package com.yize.leetcode;

import org.junit.Test;

/**
 * 451. 根据字符出现频率排序
 * 给定一个字符串，请将字符串里的字符按照出现的频率降序排列。
 *
 * 示例 1:
 *
 * 输入:
 * "tree"
 *
 * 输出:
 * "eert"
 *
 * 解释:
 * 'e'出现两次，'r'和't'都只出现一次。
 * 因此'e'必须出现在'r'和't'之前。此外，"eetr"也是一个有效的答案。
 * 示例 2:
 *
 * 输入:
 * "cccaaa"
 *
 * 输出:
 * "cccaaa"
 *
 * 解释:
 * 'c'和'a'都出现三次。此外，"aaaccc"也是有效的答案。
 * 注意"cacaca"是不正确的，因为相同的字母必须放在一起。
 * 示例 3:
 *
 * 输入:
 * "Aabb"
 *
 * 输出:
 * "bbAa"
 *
 * 解释:
 * 此外，"bbaA"也是一个有效的答案，但"Aabb"是不正确的。
 * 注意'A'和'a'被认为是两种不同的字符。
 */
public class L451 {
    @Test
    public void test(){
        System.out.println(frequencySort("tree"));
    }

    public String frequencySort(String s) {
        if(s==null){
            return s;
        }
        int[] counter=new int[128];
        char[] cs=s.toCharArray();
        for(char c:cs){
            counter[c]++;
        }

        int curr=0;
        while (curr<cs.length){
            int[] result=findMax(counter);
            char c=(char) result[0];
            int count=result[1];
            while (count-->0){
                cs[curr++]=c;
            }
        }
        return new String(cs);

    }

    public int[] findMax(int[] counter){
        int count=0;
        int index=0;
        for(int i='A';i<='z';i++){
            if(counter[i]>count){
                count=counter[i];
                index=i;
            }
        }
        counter[index]=0;
        return new int[]{index,count};
    }
}
